(* Release 3.00 *)

module r_emul

include "corelib.inc"
include "epocdefs.inc"

public  FIDRQQ   =  05C32H
public  FIWRQQ   =  0A23DH

public  FIERQQ   =  01632H
public  FIARQQ   =  0FE32H
public  FISRQQ   =  00632H
public  FICRQQ   =  00E32H

public  FJERQQ  =  00000H
public  FJARQQ  =  04000H
public  FJSRQQ  =  08000H
public  FJCRQQ  =  0C000H

public  FIXRQQ  =  0

segment _TEXT(CODE,28H)
segment _DATA(DATA,28H)

__emName: db	'SYS$8087.LDD',0
__lddName: db	'EM$:',0
__lddNameX: db	'EM$',0

extrn __SH_sword
extrn _DatCommandPtr

segment _DATA(DATA,28H)

__FChan: dw 0

select _TEXT

extrn __fp_1
extrn __sigFp
extrn __math_excep
extrn __FatalErrorPos
extrn __FatalError

xEnv	=	-256
xBuf	=	xEnv-MaxPathSize

public __FloatInit:

    push bp
    mov	 bp, sp
    add  sp, xBuf
;
    sub	 dx, dx
    mov	 cx, [_DatCommandPtr]
    jcxz noCommandLine
tryAgain:
    mov	 bx, __emName
    lea	 di, [bp][xBuf]
    sub	 si, si
    sub	 al, al
    mov	 ah, NmFilParse
    int	 FilManager
    jc	 noCommandLine
    mov	 bx, di
    xor	 al, al
    mov  ah, NmDevLoadLDD
    int  DevManager
    jnc	 loadedLdd
    cmp	 al, ExistsErr
    je   loadedLdd
    test dx, dx
    jne	 openFailed
noCommandLine:
    inc	 dx
    lea	 si, [bp][xEnv]
    mov  di, __lddNameX
    mov  ah, NmGenEnvStringGet
    int  GenManager
    jc	 openFailed
    mov	 cx, si
    jmp	 tryAgain
loadedLdd:
    mov  dx, __sigFp
    mov	 cx, -1
    mov	 bx, __lddName
    mov  ah, NmIoOpen
    int  DevManager
    jc	 openFailed
    mov  [__FChan], ax
;
    mov	 sp, bp
    pop	 bp
    jmp  __fp_1
;
openFailed:
    call __FatalErrorPos
    mov  bx, 0FFFFH
    jmp  __FatalError

public __FloatFinish:

    mov  bx, [__FChan]
    test bx, bx
    je	 skipClose
    mov	 ah, NmIoClose
    int  IoManager
    mov	 bx, __lddNameX
    mov  dx, LDDSignature
    mov  ah, NmDevDelete
    int	 DevManager
skipClose:
    ret  0

public __FloatMathExcepDos :
    fstsw [__SH_sword]
    fclex
    jmp near __math_excep

public __FloatJmpSave :

    fld  st(0), st(1)
    fstp tbyte [di][_j_st1], st(0)
    fld  st(0), st(2)
    fstp tbyte [di][_j_st2], st(0)
    ret  0

public __FloatJmpRestore :

    fld  tbyte st(0), [si][_j_st1]
    fstp st(2), st(0)
    fld  tbyte st(0), [si][_j_st2]
    fstp st(3), st(0)
    ret  0

end
